package edu.se.jai.lesson01.config;

import edu.se.jai.lesson01.ws.EchoWebSocketHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistration;

/**
 * WebSocket配置类
 * 
 * 功能说明：
 * 1. 配置WebSocket端点映射
 * 2. 设置跨域访问策略
 * 3. 注册WebSocket处理器
 * 
 * 学习要点：
 * - Spring Boot WebSocket配置
 * - 跨域安全策略
 * - 依赖注入和条件配置
 */
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    private final FeatureConfig featureConfig;

	public WebSocketConfig(FeatureConfig featureConfig) {
		this.featureConfig = featureConfig;
	}

	/**
     * 注册WebSocket处理器
     * 
     * 实现说明：
     * 1. 将EchoWebSocketHandler映射到"/ws/echo"端点
     * 2. 配置跨域访问策略
     * 3. 支持动态配置（通过FeatureConfig控制）
     * 
     * 跨域策略：
     * - 严格模式：仅允许localhost:8101
     * - 宽松模式：允许所有来源
     * 
     * @param registry WebSocket处理器注册表
     */
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        // 注册WebSocket处理器，映射到"/ws/echo"端点
        WebSocketHandlerRegistration registryBuilder = registry.addHandler(echoWebSocketHandler(), "/ws/echo");
        
        // 跨域访问配置
        registryBuilder.setAllowedOrigins("*");
    }

    /**
     * 创建WebSocket处理器Bean
     * 
     * 功能说明：
     * - 创建EchoWebSocketHandler实例
     * - 处理WebSocket连接的生命周期
     * - 实现消息的收发逻辑
     * 
     * @return WebSocket处理器实例
     */

    @Bean
    public WebSocketHandler echoWebSocketHandler() {
        return new EchoWebSocketHandler(featureConfig);
    }
}


